# -*- coding: utf-8 -*-
"""
应用程序入口 - 使用新的组件架构
"""
import sys
import importlib.util as _importlib_util
from PySide6.QtWidgets import QApplication, QSplashScreen
from PySide6.QtGui import QPixmap
from PySide6.QtCore import Qt
from loguru import logger
from .components import TgMainWindow


class TgApplication(QApplication):
    """A wrapper for QApplication to encapsulate application-level logic."""

    def __init__(
        self,
        argv,
        app_name="TG Trader Tools",
        app_version="1.0.0",
        org_name="TG Trader",
        custom_plugins=None,
        show_demo_plugins=True,
    ):
        super().__init__(argv)
        self.setApplicationName(app_name)
        self.setApplicationVersion(app_version)
        self.setOrganizationName(org_name)
        logger.info("应用程序信息设置完成")

        # 显示轻量级启动提示（Splash）。若 PyInstaller 启动闪屏“已激活”，则跳过 Qt Splash。
        self._splash = None
        if not _pyi_splash_is_alive():
            self._splash = self._create_splash_screen()
            if self._splash is not None:
                self._splash.show()
                # 处理事件以尽快显示 Splash
                self.processEvents()

        # 延迟创建主窗口，让 Splash 更早出现，重型初始化放在外部完成后再创建
        self.main_window = None
        if custom_plugins is not None or not show_demo_plugins:
            # 若构造参数已给出自定义插件或关闭演示插件，则立即创建
            logger.info("创建主窗口...")
            self.main_window = TgMainWindow(
                custom_plugins=custom_plugins, show_demo_plugins=show_demo_plugins
            )
            logger.info("主窗口创建完成")

    def run(self):
        """Shows the main window and starts the application event loop."""
        # 若主窗口尚未创建，按默认方式创建（加载演示插件）
        if self.main_window is None:
            logger.info("创建主窗口...")
            self.main_window = TgMainWindow()
            logger.info("主窗口创建完成")

        logger.info("显示窗口...")
        self.main_window.show()
        logger.info(f"窗口显示完成，可见性: {self.main_window.isVisible()}")

        # 关闭 PyInstaller 启动闪屏（如仍在显示）
        if _pyi_splash_is_alive():
            try:
                import pyi_splash  # type: ignore
                pyi_splash.close()
            except Exception as e:
                logger.exception(e)

        # 关闭 Qt Splash（如有）
        if getattr(self, "_splash", None) is not None:
            self._splash.finish(self.main_window)
            self._splash = None

        logger.info("启动事件循环...")
        result = self.exec()
        logger.info(f"应用程序退出，返回码: {result}")
        return result

    def init_main_window(self, custom_plugins=None, show_demo_plugins=True):
        """在外部重型初始化完成后，创建主窗口。

        适用场景：希望尽早展示 Splash，将配置、插件等初始化放在 App 构造之后进行，
        然后调用该方法创建主窗口，最后调用 run() 进入事件循环。
        """
        if self.main_window is None:
            logger.info("创建主窗口...")
            self.main_window = TgMainWindow(
                custom_plugins=custom_plugins, show_demo_plugins=show_demo_plugins
            )
            logger.info("主窗口创建完成")

    def _create_splash_screen(self):
        """创建一个简单的文本启动提示 Splash。"""
        try:
            # 创建纯色底的占位 Pixmap（无需外部图片资源）
            pixmap = QPixmap(480, 270)
            pixmap.fill(Qt.white)
            splash = QSplashScreen(pixmap)
            splash.setWindowFlag(Qt.WindowStaysOnTopHint, True)
            # 英文日志、中文注释：这里显示启动提示文本
            splash.showMessage(
                "Starting TG Trader Tools...\nLoading UI...",
                Qt.AlignHCenter | Qt.AlignVCenter,
                Qt.black,
            )
            return splash
        except Exception as e:
            # 英文日志；保留异常堆栈
            logger.exception(e)
            return None


def _pyi_splash_is_alive() -> bool:
    """判断 PyInstaller 的 pyi_splash 是否处于激活状态。

    说明：
    - 在部分 PyInstaller 版本中，即使未启用 --splash，`pyi_splash` 也可能作为“假模块”存在，
      直接以 find_spec/import 判断会得到非 None，从而造成误判。
    - 正确的方式是调用 `pyi_splash.is_alive()`；只有返回 True 才表示启动闪屏处于显示状态。
    """
    try:
        import pyi_splash  # type: ignore
        return bool(getattr(pyi_splash, "is_alive", None) and pyi_splash.is_alive())
    except Exception:
        return False

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

def update_splash_text(self, text: str):
        """更新 Qt Splash 上的文本（仅当使用 Qt Splash 时）。"""
        if getattr(self, "_splash", None) is not None:
            try:
                self._splash.showMessage(
                    text, Qt.AlignHCenter | Qt.AlignVCenter, Qt.black
                )
                self.processEvents()
            except Exception as e:
                logger.exception(e)
